package response

import (
	"encoding/json"
	"fmt"
	"github.com/go-playground/validator/v10"
	"net/http"
	"strings"
)

type Response struct {
	Status string `json:"status"`
	Error  string `json:"error"`
}

const (
	StatusOK    = "OK"    // 操作成功的状态标识
	StatusError = "Error" // 操作失败的状态标识
)

// WriteJson 向HTTP响应写入JSON格式数据的工具函数
func WriteJson(w http.ResponseWriter, status int, data interface{}) error {
	// 设置响应头 Content-Type 为 application/json，表明响应体为JSON格式
	w.Header().Set("Content-Type", "application/json")

	// 写入HTTP状态码（如200 OK，400 Bad Request等）
	w.WriteHeader(status)

	// 使用JSON编码器将数据序列化为JSON并写入响应体
	return json.NewEncoder(w).Encode(data)
}

// GeneralError 创建一个通用的错误响应结构体
func GeneralError(err error) Response {
	// 返回填充了错误状态的 Response 对象
	return Response{
		Status: StatusError, // 设置状态为错误状态常量
		Error:  err.Error(), // 将错误对象转换为字符串消息
	}
}

// ValidationError 处理验证错误，将验证器错误转换为用户友好的错误消息
func ValidationError(errs validator.ValidationErrors) Response {
	// 创建字符串切片用于存储错误消息
	var errMsgs []string

	// 遍历所有验证错误
	for _, err := range errs {
		// 根据错误类型生成相应的错误消息
		switch err.ActualTag() {
		case "required":
			// 处理必填字段缺失错误
			errMsgs = append(errMsgs, fmt.Sprintf("field %s is required field", err.Field()))
		default:
			// 处理其他类型的验证错误
			errMsgs = append(errMsgs, fmt.Sprintf("field %s is invalid", err.Field()))
		}
	}

	// 返回包含错误状态和合并错误消息的响应
	return Response{
		Status: StatusError,                 // 设置状态为错误
		Error:  strings.Join(errMsgs, ", "), // 将多个错误消息用逗号分隔合并
	}
}
